home *** CD-ROM | disk | FTP | other *** search
- (*===========================================================================*)
- (* Procedure for taking system dump *)
- (* *)
- (* Copyright 1991, 1992 by H. Roy Engehausen. All rights reserved. *)
- (* *)
- (*===========================================================================*)
-
- {$O+} {This procedure gets overlayed}
-
- UNIT BBDUMP;
-
- INTERFACE
-
- USES
- bbdummy;
-
- PROCEDURE dump_init;
- PROCEDURE dump_all;
- PROCEDURE dump_state;
- PROCEDURE dump_overlay;
- PROCEDURE dump_trace;
- PROCEDURE dump_msg(m_ptr : msg_index_ptr);
- PROCEDURE dump_free_list;
- PROCEDURE dump_thread(t : tcb_ptr);
- PROCEDURE dump_port(p : port_block_ptr);
- PROCEDURE dump_all_thread;
- PROCEDURE dump_all_msg;
- PROCEDURE dump_semaphores;
- PROCEDURE dump_window(win_num : BYTE);
- PROCEDURE dump_window_all;
- PROCEDURE dump_string(s : STRING);
- PROCEDURE dump_reason(s : STRING);
- PROCEDURE dump_hex(p : POINTER; l : WORD);
- PROCEDURE dump_hex_addr(p : POINTER; l : WORD);
- PROCEDURE dump_action_item(p : action_msg_ptr);
- PROCEDURE dump_action_all;
- PROCEDURE dump_search_item(p : search_block_ptr);
- PROCEDURE dump_search_chain(p : search_block_ptr);
-
- IMPLEMENTATION
-
- USES
- CRT,
- DOS,
- bbbug,
- bbmem,
- bbmisc3,
- bbsema2,
- bbtask,
- bbwin;
-
- VAR
- dump_file : TEXT;
- dump_open : BYTE;
- first_dump : BOOLEAN;
-
- (*===========================================================================*)
- (* Dump a section of memory *)
- (*===========================================================================*)
-
- PROCEDURE hex_dump(p : POINTER; l : WORD);
-
- TYPE
- dump_array = ARRAY[1..4096] OF BYTE;
-
- VAR
- dump_ptr : ^dump_array;
- i : WORD;
-
- BEGIN;
-
- dump_ptr := p;
-
- FOR i := 1 TO l DO
- BEGIN;
- WRITE(dump_file, b2x(dump_ptr^[i]));
- IF (i AND $1) = 0 THEN
- WRITE(dump_file, ' ');
- IF (i AND $F) = 0 THEN
- WRITELN(dump_file);
- END;
-
- WRITELN(dump_file);
-
- END;
-
- (*===========================================================================*)
- (* Ready the dump file for output *)
- (*===========================================================================*)
-
- PROCEDURE dump_init;
-
- VAR
- i : INTEGER;
- j : INTEGER;
- s : STRING[3];
-
- BEGIN;
-
- first_dump := TRUE;
- dump_open := 0;
-
- FOR i := 1 TO 999 DO
- BEGIN;
- STR(i, s);
- ASSIGN(dump_file, 'DUMP.' + s);
-
- {$I-}
- RESET(dump_file);
- {$I+}
-
- j := IORESULT;
-
- IF j = 2 THEN
- EXIT;
-
- IF j = 0 THEN
- CLOSE(dump_file);
-
- END;
-
- ASSIGN(dump_file, 'DUMP.BB');
-
-
- END;
-
- (*===========================================================================*)
- (* Ready the dump file for output *)
- (*===========================================================================*)
-
- PROCEDURE open_dump;
-
- VAR
- i : INTEGER;
-
- BEGIN;
-
- IF first_dump THEN
- BEGIN;
- WRITELN('Dump in progress');
- first_dump := FALSE;
- END;
-
- INC(dump_open);
- IF dump_open > 1 THEN EXIT;
-
- {$I-}
- RESET(dump_file);
- {$I+}
-
- i := IORESULT;
-
- IF i = 0 THEN
- CLOSE(dump_file);
-
- CASE i OF
- 0: APPEND(dump_file);
- 2: REWRITE(dump_file);
- ELSE
- BEGIN;
- WRITELN('I/O error on dump open');
- HALT;
- END;
-
- END;
-
- END;
-
- (*===========================================================================*)
- (* Close the dump file *)
- (*===========================================================================*)
-
- PROCEDURE close_dump;
- BEGIN;
-
- IF dump_open > 0 THEN
- DEC(dump_open);
-
- IF dump_open > 0 THEN
- EXIT;
-
- CLOSE(dump_file);
-
- END;
-
- (*===========================================================================*)
- (* Dump a string *)
- (*===========================================================================*)
-
- PROCEDURE dump_string(s : STRING);
- BEGIN;
- open_dump;
- WRITELN(dump_file, s);
- close_dump;
- END;
-
- (*===========================================================================*)
- (* Dump a reason *)
- (*===========================================================================*)
-
- PROCEDURE dump_reason(s : STRING);
- BEGIN;
- WRITELN(s);
- open_dump;
- WRITELN(dump_file, s);
- close_dump;
- END;
-
- (*===========================================================================*)
- (* Dump the call stack *)
- (*===========================================================================*)
-
- PROCEDURE dump_call_stack(in_seg : WORD; bp : WORD);
-
- VAR
- called_by : POINTER;
- depth : BYTE;
- stack_ptr : stack_frame_ptr_type;
- displaced_seg : WORD;
-
- BEGIN;
-
- depth := 1;
-
- (*-----------------------------------------------------------------------*)
- (* Loop back thru the stack *)
- (*-----------------------------------------------------------------------*)
-
- stack_ptr.pnt := PTR(in_seg, bp);
-
- REPEAT
-
- (*---------------------------------------------------------------------*)
- (* Get segment we were called from *)
- (*---------------------------------------------------------------------*)
-
- displaced_seg := stack_ptr.pnt^.link_seg;
-
- (*---------------------------------------------------------------------*)
- (* Compute difference from first entry CSEG *)
- (*---------------------------------------------------------------------*)
-
- IF displaced_seg >= main_cs THEN
- displaced_seg := displaced_seg - main_cs
- ELSE
- displaced_seg := NOT(main_cs - displaced_seg);
-
- (*---------------------------------------------------------------------*)
- (* Set the result *)
- (*---------------------------------------------------------------------*)
-
- called_by := PTR(displaced_seg, stack_ptr.pnt^.link_off);
-
- WRITELN(dump_file, 'Proc traceback ', depth, ' = ', p2x(called_by),
- ' - ', w2x(stack_ptr.pnt^.link_seg));
-
- INC(depth);
-
- stack_ptr.off := stack_ptr.pnt^.next_bp;
-
- UNTIL (depth > 20)
- OR (stack_ptr.off = 0)
- OR (stack_ptr.pnt^.next_bp = 0); (*----- End loop thru stack *)
-
- (*-----------------------------------------------------------------------*)
- (* All done *)
- (*-----------------------------------------------------------------------*)
-
- END;
-
- (*===========================================================================*)
- (* Dump everything *)
- (*===========================================================================*)
-
- PROCEDURE dump_all;
- BEGIN;
- dump_state;
- dump_overlay;
- dump_trace;
- dump_free_list;
- dump_all_thread;
- (* dump_all_msg; *)
- dump_semaphores;
- dump_window_all;
- END;
-
- (*===========================================================================*)
- (* Dump operating mode *)
- (*===========================================================================*)
-
- TYPE
- op_mode_ptr = ^op_mode;
-
- PROCEDURE dump_op_mode(p : op_mode_ptr);
- BEGIN;
- WITH p^ DO
- BEGIN;
- WRITELN(dump_file, 'Fwd emergency only = ', mode_fwd_emer);
- WRITELN(dump_file, 'No NTS forward = ', mode_fwd_nonts);
- WRITELN(dump_file, 'Emergency tfc only = ', mode_acc_emer);
- WRITELN(dump_file, 'No NTS accept = ', mode_acc_nonts);
- WRITELN(dump_file, 'E mode users only = ', mode_e_users);
- WRITELN(dump_file, 'Allow call change = ', mode_user_change);
- WRITELN(dump_file, 'Stop connects = ', mode_stop_connect);
- WRITELN(dump_file, 'Stop forwarding = ', mode_stop_fwd);
- END;
- END;
-
- (*===========================================================================*)
- (* Dump the system state *)
- (*===========================================================================*)
-
- PROCEDURE dump_state;
-
- BEGIN;
-
- open_dump;
-
- WRITELN(dump_file);
- WRITELN(dump_file, '==> System state');
- WRITELN(dump_file, 'Main switch = ', main_switch);
- WRITELN(dump_file, 'Main CS = ', main_switch);
- WRITELN(dump_file, 'Shutdown switch = ', shutdown_switch);
- WRITELN(dump_file, 'Dead tcb list = ', p2x(dead_tcb_list));
- WRITELN(dump_file, 'Active port = ', p2x(active_port));
- WRITELN(dump_file, 'Active thread = ', p2x(active_tcb));
- WRITELN(dump_file, 'Forward out busy = ', fwd_out_busy);
- WRITELN(dump_file, 'Alive tcb count = ', alive_tcb_count);
- WRITELN(dump_file, 'Overhead tcb count = ', overhead_tcb_count);
- WRITELN(dump_file, 'Main CS = ', w2x(main_cs));
- dump_op_mode(@opt_block.operate_mode);
-
- WRITELN(dump_file);
-
- close_dump;
-
- END;
-
- (*===========================================================================*)
- (* Dump the overlay state *)
- (*===========================================================================*)
-
- PROCEDURE dump_overlay_data;
-
- VAR
- over_head : over_head_type;
- w : WORD;
-
- BEGIN;
-
- WRITELN(dump_file);
- WRITELN(dump_file, '==> Overlay state');
-
- WRITELN(dump_file, 'Overlay code list = ', w2x(OvrCodeList));
- WRITELN(dump_file, 'Overlay load list = ', w2x(OvrLoadList));
- WRITELN(dump_file, 'Overlay size = ', OvrHeapSize);
- WRITELN(dump_file, 'Overlay debug = ', p2x(OvrDebugPtr));
- WRITELN(dump_file, 'Overlay start = ', w2x(OvrHeapOrg));
- WRITELN(dump_file, 'Overlay pointer = ', w2x(OvrHeapPtr));
- WRITELN(dump_file, 'Overlay end = ', w2x(OvrHeapEnd));
-
- WRITELN(dump_file);
-
- (*-----------------------------------------------------------------*)
- (* Display the overlay list *)
- (*-----------------------------------------------------------------*)
-
- w := OvrCodeList;
- over_head.off := 0;
-
- WHILE w <> 0 DO
- BEGIN;
- over_head.seg := w + PrefixSeg + $10;
- WITH over_head.pnt^ DO
- BEGIN;
- WRITE(dump_file, 'Overlay ', w2x(w),
- ' returns to ', w2x(return_ofs));
- IF load_segment <> 0 THEN
- WRITELN(dump_file, ' -- loaded at ', w2x(load_segment))
- ELSE
- WRITELN(dump_file);
- (* hex_dump(over_head.pnt, 64); *)
- w := code_list_next;
- END;
- END;
-
- END;
-
- (*===========================================================================*)
- (* Dump the overlay state *)
- (*===========================================================================*)
-
- PROCEDURE dump_overlay;
-
- BEGIN;
-
- open_dump;
-
- dump_overlay_data;
-
- close_dump;
-
- END;
-
- (*===========================================================================*)
- (* Dump the called_by table *)
- (*===========================================================================*)
-
- PROCEDURE dump_trace;
-
- VAR
- w : WORD;
-
- BEGIN;
-
- open_dump;
-
- WRITELN(dump_file);
-
- ASM;
- MOV w,BP
- END;
-
- dump_call_stack(SSEG, w);
-
- WRITELN(dump_file);
-
- dump_overlay_data;
-
- close_dump;
-
- END;
-
- (*===========================================================================*)
- (* Dump a section of memory *)
- (*===========================================================================*)
-
- PROCEDURE dump_hex(p : POINTER; l : WORD);
- BEGIN;
-
- open_dump;
-
- WRITELN(dump_file);
-
- hex_dump(p, l);
-
- close_dump;
-
- END;
-
- (*===========================================================================*)
- (* Dump a section of memory with addresses *)
- (*===========================================================================*)
-
- PROCEDURE hex_dump_addr(p : POINTER; l : WORD);
-
- TYPE
- dump_array = ARRAY[1..9999] OF BYTE;
-
- VAR
- dump_ptr : ^dump_array;
- i : WORD;
-
- BEGIN;
-
- dump_ptr := p;
-
- WRITE(dump_file, p2x(dump_ptr), ' ');
-
- FOR i := 1 TO l DO
- BEGIN;
- WRITE(dump_file, b2x(dump_ptr^[i]));
- IF (i AND $1) = 0 THEN
- WRITE(dump_file, ' ');
- IF (i AND $F) = 0 THEN
- BEGIN;
- WRITELN(dump_file);
- IF i <> l THEN
- WRITE(dump_file, p2x(@dump_ptr^[i+1]), ' ');
- END;
- END;
-
- WRITELN(dump_file);
-
- END;
-
- (*===========================================================================*)
- (* Dump a section of memory *)
- (*===========================================================================*)
-
- PROCEDURE dump_hex_addr(p : POINTER; l : WORD);
- BEGIN;
-
- open_dump;
-
- WRITELN(dump_file);
-
- hex_dump_addr(p, l);
-
- close_dump;
-
- END;
-
- (*===========================================================================*)
- (* Convert a section of memory to a hex string *)
- (*===========================================================================*)
-
- FUNCTION hex_str(p : POINTER; l : BYTE) : STRING;
-
- TYPE
- dump_array = ARRAY[1..256] OF BYTE;
-
- VAR
- dump_ptr : ^dump_array;
- i : BYTE;
- s : STRING;
-
- BEGIN;
-
- dump_ptr := p;
- s := '';
-
- FOR i := 1 TO l DO
- BEGIN;
-
- s := s + b2x(dump_ptr^[i]);
- IF (i AND $3) = 0 THEN
- s := s + ' ';
-
- END;
-
- hex_str := s;
-
- END;
-
- (*===========================================================================*)
- (* Dump an access block *)
- (*===========================================================================*)
-
- PROCEDURE dump_access_block(p: access_block_ptr);
-
- VAR
- x : BYTE;
-
- BEGIN;
-
- x := p^.access_flags;
-
- WRITELN(dump_file, 'Acsblock = ', b2x(x));
- WRITELN(dump_file, 'Acs sysop = ', (x AND access_f_sysop) <> 0);
- WRITELN(dump_file, 'Acs bbs = ', (x AND access_f_bbs) <> 0);
- WRITELN(dump_file, 'Acs user = ', (x AND access_f_user) <> 0);
- WRITELN(dump_file, 'Acs send = ', (x AND access_f_user_send) <> 0);
-
- END;
-
- (*===========================================================================*)
- (* Dump a message without changing state of dump file *)
- (*===========================================================================*)
-
- PROCEDURE sub_dump_msg(m_ptr : msg_index_ptr);
-
- VAR
- dis_cnt : BYTE;
- dis_ptr : msg_d_ptr;
- i : BYTE;
- rdis_ptr : msg_dr_ptr;
-
- BEGIN;
-
- WRITELN(dump_file, 'Dump message -- ', m_ptr^.msg_i_mb.msg_number,
- ' at ', p2x(m_ptr));
-
- WRITELN(dump_file, 'Type = ', m_ptr^.msg_i_mb.msg_type);
- WRITELN(dump_file, 'Flags = ', w2x(m_ptr^.msg_i_mb.msg_flag));
- WRITELN(dump_file, 'Size = ', m_ptr^.msg_i_mb.msg_size);
- WRITELN(dump_file, 'To = ', m_ptr^.msg_i_mb.msg_to);
- WRITELN(dump_file, 'To @ = ', m_ptr^.msg_i_mb.msg_to_at);
- WRITELN(dump_file, 'Subject = ', m_ptr^.msg_i_mb.msg_subj);
-
- WRITELN(dump_file);
-
- WRITELN(dump_file, 'Next = ', p2x(m_ptr^.msg_i_next));
- WRITELN(dump_file, 'Last = ', p2x(m_ptr^.msg_i_last));
- WRITELN(dump_file, 'Fwd_l = ', p2x(m_ptr^.msg_i_fwd_l));
- WRITELN(dump_file, 'Other = ', p2x(m_ptr^.msg_i_dis));
-
- IF m_ptr^.msg_i_dis <> NIL THEN
- WRITELN(dump_file, 'OtherData = ', hex_str(m_ptr^.msg_i_dis, 32));
-
- WRITELN(dump_file);
-
- IF (m_ptr^.msg_i_mb.msg_flag AND mf_fwd_list) <> 0 THEN
- BEGIN;
-
- WRITELN(dump_file, 'Message has distribution list');
- dis_ptr := m_ptr^.msg_i_dis;
-
- IF dis_ptr = NIL THEN
- BEGIN;
- WRITELN(dump_file, 'Distribution list pointer is NIL');
- EXIT;
- END;
-
- IF (m_ptr^.msg_i_mb.msg_flag AND mf_disrout) <> 0 THEN
- BEGIN;
- rdis_ptr := m_ptr^.msg_i_dr;
- dis_ptr := rdis_ptr^.msg_dr_dblk;
- WRITELN(dump_file, 'Distribution route block indicated -- ',
- p2x(rdis_ptr));
- END
- ELSE
- rdis_ptr := NIL;
-
- IF dis_ptr = NIL THEN
- BEGIN;
- WRITELN(dump_file,
- '==> Distribution list pointer from route blocks is NIL');
- EXIT;
- END;
-
- dis_cnt := dis_ptr^.msg_d_no;
-
- WRITELN(dump_file);
- WRITELN(dump_file, 'Distribution count is ', dis_cnt, ' at ',
- p2x(dis_ptr));
-
- IF dis_cnt > msg_dist_max THEN
- dis_cnt := msg_dist_max;
-
- IF rdis_ptr <> NIL THEN
- BEGIN;
- WRITELN(dump_file);
-
- hex_dump(rdis_ptr, 16);
-
- FOR i := 1 TO dis_cnt DO
- WRITELN(dump_file, 'Rout ', i, ' = ',
- p2x(rdis_ptr^.msg_dr_data[i]));
- END;
-
- hex_dump(dis_ptr, 16);
-
- WRITELN(dump_file);
- FOR i := 1 TO dis_cnt DO
- WITH dis_ptr^.msg_d_array[i] DO
- WRITELN(dump_file, 'Distribution ', i, ' = ', w2x(msg_d_flag),
- ' = ', msg_d_info);
-
- END;
-
- WRITELN(dump_file);
-
- END;
-
- (*===========================================================================*)
- (* Dump a message *)
- (*===========================================================================*)
-
- PROCEDURE dump_msg(m_ptr : msg_index_ptr);
- BEGIN;
- open_dump;
- sub_dump_msg(m_ptr);
- close_dump;
- END;
-
- (*===========================================================================*)
- (* Dump the free chain (Turbo 6) *)
- (*===========================================================================*)
-
- PROCEDURE dump_free_list;
-
- TYPE
- PFreeRec = ^TFreeRec;
- TFreeRec = RECORD
- Next : PFreeRec;
- Size : POINTER;
- END;
-
- VAR
- p1 : PFreeRec;
- p2 : POINTER;
-
- BEGIN;
-
- open_dump;
-
- WRITELN(dump_file, 'HeapOrg = ', p2x(HeapOrg));
- WRITELN(dump_file, 'HeapPtr = ', p2x(HeapPtr));
- WRITELN(dump_file, 'FreeList = ', p2x(FreeList));
- WRITELN(dump_file, 'HeapError = ', p2x(HeapError));
-
- p1 := FreeList;
-
- REPEAT
- BEGIN;
- p2 := PTR(SEG(p1^) + SEG(p1^.Size^),
- OFS(p1^) + OFS(p1^.Size^));
-
- WRITELN(dump_file, p2x(p1), ' = ', p2x(p1^.Size), ' ',
- hex_str(p1, 32), ' / ', hex_str(p2, 32));
-
- IF p1 <> HeapPtr THEN
- p1 := p1^.Next;
- END;
- UNTIL p1 = HeapPtr;
-
- WRITELN(dump_file);
-
- close_dump;
-
- END;
-
- (*===========================================================================*)
- (* Dump all the messages *)
- (*===========================================================================*)
-
- PROCEDURE dump_all_msg;
-
- VAR
- p : msg_index_ptr;
-
- BEGIN;
-
- p := msg_index_start;
-
- WHILE p <> NIL DO
- BEGIN;
- dump_msg(p);
- p := p^.msg_i_next;
- END;
-
- END;
-
- (*===========================================================================*)
- (* Dump a thread *)
- (*===========================================================================*)
-
- PROCEDURE sub_dump_thread(t : tcb_ptr; port_too : BOOLEAN);
-
- VAR
- chained_str : str_m_chain;
- chained_mem : mem_list_ptr;
-
- BEGIN;
-
- WRITELN(dump_file);
- WRITELN(dump_file,'==> Dump TCB at ', p2x(t));
- WRITELN(dump_file);
-
- WRITELN(dump_file, 'Next tcb = ', p2x(t^.next_tcb));
- WRITELN(dump_file, 'Tcb # = ', t^.tcb_number);
- WRITELN(dump_file, 'Window # = ', t^.window);
- WRITELN(dump_file, 'Color = ', t^.w_color);
- WRITELN(dump_file, 'Name = ', t^.tcb_name);
- WRITELN(dump_file, 'Thread type = ', ORD(t^.tcb_type));
- WRITELN(dump_file, 'Port = ', p2x(t^.tcb_port));
- WRITELN(dump_file, 'Channel # = ', t^.channel);
- WRITELN(dump_file, 'Port/Chan = ', t^.port_chan_s);
- WRITELN(dump_file, 'Max Pac = ', t^.max_pac);
-
- WRITELN(dump_file, 'Last L = ', t^.last_l_time);
-
- WRITELN(dump_file);
-
- WRITELN(dump_file, 'transmit_idle = ', t^.tcb_transmit_idle );
- WRITELN(dump_file, 'console = ', t^.tcb_console );
- WRITELN(dump_file, 'connect = ', t^.tcb_connect );
- WRITELN(dump_file, 'Abbs = ', t^.tcb_abbs );
- WRITELN(dump_file, 'Mids_ok = ', t^.tcb_mids_ok );
- WRITELN(dump_file, 'H_ok = ', t^.tcb_h_ok );
- WRITELN(dump_file, 'Ignore_lc = ', t^.tcb_ignore_lc );
- WRITELN(dump_file, 'Opr_talk = ', t^.tcb_opr_talk );
- WRITELN(dump_file, 'Ignore_port_chan = ', t^.tcb_ignore_port_chan);
- WRITELN(dump_file, 'Never kill = ', t^.tcb_never_kill );
- WRITELN(dump_file, 'Dead_in_progress = ', t^.tcb_dead_in_progress);
- WRITELN(dump_file, 'Dead = ', t^.tcb_dead );
- WRITELN(dump_file, 'Stop_tnc_io = ', t^.tcb_stop_tnc_io );
- WRITELN(dump_file, 'Make_cc = ', t^.tcb_make_cc );
- WRITELN(dump_file, 'No_show_sdata = ', t^.tcb_no_show_sdata );
- WRITELN(dump_file, 'Binary = ', t^.tcb_binary );
- WRITELN(dump_file, 'Rcv_msg = ', t^.tcb_rcv_msg );
- WRITELN(dump_file, 'Rev_fwd = ', t^.tcb_rev_fwd );
- WRITELN(dump_file, 'Sysop_pw_ok = ', t^.tcb_sysop_pw_ok );
- WRITELN(dump_file, 'Access_ok = ', t^.tcb_access_ok );
- WRITELN(dump_file, 'Error_sw = ', t^.error_sw );
-
- WRITELN(dump_file, 'Bid Level = ', t^.tcb_bid_level);
-
- WRITELN(dump_file, 'SS = ', w2x(t^.sseg_value));
- WRITELN(dump_file, 'SP = ', w2x(t^.sptr_value));
- WRITELN(dump_file, 'BP = ', w2x(t^.bptr_value));
- WRITELN(dump_file, 'SS Init = ', w2x(t^.sseg_init));
- WRITELN(dump_file, 'SS Bot = ', w2x(t^.sseg_bot));
- WRITELN(dump_file, 'SP Init = ', w2x(t^.sptr_init));
- WRITELN(dump_file, 'Stack size = ', t^.sseg_size);
-
- WRITELN(dump_file, 'Stack usage = ', t^.stack_usage);
- WRITELN(dump_file, 'Stack temp = ', hex_str(@t^.stack_temp, 10));
- WRITELN(dump_file, 'Stack count = ', t^.stack_cnt);
-
- WRITELN(dump_file, 'Tnc buffer size = ', t^.tnc_b_size);
- WRITELN(dump_file, 'Tnc_htt/tth = ', hex_str(@t^.tnc_htt, 32));
- WRITELN(dump_file, 'Tnc resp type = ', t^.tnc_type);
- WRITELN(dump_file, 'Tnc data = ', hex_str(@t^.tnc_data, 32));
- WRITELN(dump_file, 'Tnc null = ', t^.tnc_null);
-
- WRITELN(dump_file, 'Out line = ', t^.out_line);
- WRITELN(dump_file, 'Out char = ', t^.out_char);
-
- WRITELN(dump_file, 'I data = ', hex_str(@t^.i_data, 32));
- WRITELN(dump_file, 'O data = ', hex_str(@t^.o_data, 32));
-
- WRITELN(dump_file, 'Fwd msg pointer = ', hex_str(@t^.curr_fwd, 32));
-
- WRITELN(dump_file, 'Conv tcb = ', p2x(t^.conv_tcb));
-
- dump_access_block(@t^.tcb_access_mode);
-
- WRITELN(dump_file);
-
- WRITELN(dump_file, 'Uid data');
- hex_dump(@t^.uid_data, 128);
-
- WRITELN(dump_file);
-
- chained_str := t^.tnc_in_chn;
- WRITELN(dump_file, 'Input chain = ', p2x(chained_str));
-
- WHILE chained_str <> NIL DO
- BEGIN;
- hex_dump_addr(chained_str, 32);
- chained_str := chained_str^.str_m_next;
- END;
-
- WRITELN(dump_file);
-
- chained_str := t^.tnc_in_chn;
- WRITELN(dump_file, 'C input = ', p2x(chained_str));
-
- WHILE chained_str <> NIL DO
- BEGIN;
- hex_dump_addr(chained_str, 32);
- chained_str := chained_str^.str_m_next;
- END;
-
- WRITELN(dump_file);
- chained_mem := t^.stor_list;
- WRITELN(dump_file, 'Storage list = ', p2x(chained_mem));
-
- WHILE chained_mem <> NIL DO
- BEGIN;
- hex_dump_addr(chained_mem, 32);
- chained_mem := chained_mem^.next_mem_list;
- END;
-
- WRITELN(dump_file);
- sub_dump_msg(@t^.curr_msg);
-
- IF t <> active_tcb THEN
- BEGIN;
- WRITELN(dump_file);
- dump_call_stack(t^.sseg_value, t^.bptr_value);
- END;
-
- END;
-
- (*===========================================================================*)
- (* Dump a thread *)
- (*===========================================================================*)
-
- PROCEDURE dump_thread(t : tcb_ptr);
- BEGIN;
- open_dump;
- sub_dump_thread(t, FALSE);
- close_dump;
- END;
-
- (*===========================================================================*)
- (* Dump a port *)
- (*===========================================================================*)
-
- PROCEDURE dump_port_data(p : port_block_ptr);
- BEGIN;
-
- WRITELN(dump_file);
- WRITELN(dump_file,'==> Dump port at ', p2x(p));
- WRITELN(dump_file);
-
- WRITELN(dump_file, 'Next port = ', p2x(p^.next_port));
- WRITELN(dump_file, 'Main port = ', p2x(p^.main_port));
- WRITELN(dump_file, 'Aux thread = ', p2x(p^.aux_thread));
- WRITELN(dump_file, 'Com # = ', p^.com_number);
- WRITELN(dump_file, 'Port Char = ', p^.port_char);
- WRITELN(dump_file, 'Port Name = ', p^.port_name);
- WRITELN(dump_file, 'Port Type = ', ORD(p^.port_type));
- WRITELN(dump_file, 'Host Only TNC = ', p^.port_host_only);
- WRITELN(dump_file, 'Sub Port = ', p^.port_sub_port);
- WRITELN(dump_file, 'Monitor = ', p^.port_monitor);
- WRITELN(dump_file, 'Remote Sysop OK? = ', p^.port_r_sysop);
- WRITELN(dump_file, 'Broadcast = ', p^.port_bcst);
- WRITELN(dump_file, 'Up/Download OK? = ', p^.port_up_down);
- WRITELN(dump_file, 'Binary Xfr OK? = ', p^.port_no_binary);
- WRITELN(dump_file, 'PK232 Ack needed = ', p^.port_pk232_data_ack);
- WRITELN(dump_file, 'No outbound fwd = ', p^.port_no_out_fwd);
- WRITELN(dump_file, 'No fwd when busy = ', p^.port_no_busy_fwd);
- WRITELN(dump_file, 'SSID supress = ', p^.port_suppress_ssid);
- WRITELN(dump_file, 'Use user chan fwd= ', p^.port_use_user_chan);
- WRITELN(dump_file, 'Dflt transparent = ', p^.port_dflt_trans);
- WRITELN(dump_file, 'PCPA Port number = ', p^.port_num);
- WRITELN(dump_file, 'Color = ', p^.port_color);
- WRITELN(dump_file, 'Semaphore = ', p^.port_sema);
- WRITELN(dump_file, 'No mail bcst = ', p^.port_no_mail_bcst);
- WRITELN(dump_file, 'No mail count = ', p^.port_no_mail_cnt);
- WRITELN(dump_file, 'User class allow = ', ORD(p^.port_allow));
- WRITELN(dump_file, 'Default pkt size = ', p^.dflt_pac);
- WRITELN(dump_file, 'Maximum pkt size = ', p^.max_pac);
- WRITELN(dump_file, 'Data rate = ', p^.data_rate);
- WRITELN(dump_file, 'Time out = ', p^.data_rate);
- WRITELN(dump_file, 'Forward minute = ', p^.fwd_min);
- WRITELN(dump_file, 'Maximum connect = ', p^.max_conn);
- WRITELN(dump_file, 'Maximum channels = ', p^.max_chan);
- WRITELN(dump_file, 'Maximum pkt pend = ', p^.port_pend);
- WRITELN(dump_file, 'Dflt screen len = ', p^.dflt_scrl);
- WRITELN(dump_file, 'Dflt display fmt = ', p^.new_display);
- WRITELN(dump_file, 'Reject action = ', p^.reject_act);
- WRITELN(dump_file, 'Dflt language = ', p^.dflt_lang);
- WRITELN(dump_file, 'First load name = ', p^.first_load);
- WRITELN(dump_file, 'Dflt ordering = ', p^.dflt_order);
-
- dump_op_mode(@p^.port_operate_mode);
-
- dump_access_block(@p^.dflt_access);
-
- IF p^.port_type <> port_modem THEN
- BEGIN;
- END
- ELSE
- BEGIN;
- WRITELN(dump_file, 'Modem options = ', p^.modem_optns);
- WRITELN(dump_file, 'Answer on ring = ', p^.answer_ring);
- WRITELN(dump_file, 'CR timeout = ', p^.cr_timeout);
- WRITELN(dump_file, 'Current rate = ', p^.cur_rate);
- WRITELN(dump_file, 'Echo = ', p^.modem_echo);
- WRITELN(dump_file, 'Echo now = ', p^.modem_e_now);
- WRITELN(dump_file, 'CR=CR/LF = ', p^.modem_crlf);
- WRITELN(dump_file, 'Dialing = ', p^.modem_dial);
- WRITELN(dump_file, 'Connect message = ', p^.modem_conn);
- WRITELN(dump_file, 'Freeze speed? = ', p^.modem_freez);
- WRITELN(dump_file, 'Modem DCD = ', p^.port_modem_dcd);
- END;
- END;
-
- (*===========================================================================*)
- (* Dump a port *)
- (*===========================================================================*)
-
- PROCEDURE dump_port(p : port_block_ptr);
- BEGIN;
- open_dump;
- dump_port_data(p);
- close_dump;
- END;
-
- (*===========================================================================*)
- (* Dump all threads and ports *)
- (*===========================================================================*)
-
- PROCEDURE dump_all_thread;
-
- VAR
-
- p : port_block_ptr;
- t : tcb_ptr;
-
- BEGIN;
-
- open_dump;
-
- dump_state;
-
- t := ring_tcb;
- REPEAT
- sub_dump_thread(t, FALSE);
- t := t^.next_tcb;
- UNTIL t = ring_tcb;
-
- p := ring_port;
- REPEAT
- dump_port_data(p);
- p := p^.next_port;
- UNTIL p = ring_port;
-
- dump_port_data(@dummy_port);
-
- close_dump;
-
- END;
-
- (*===========================================================================*)
- (* Dump Semaphores *)
- (*===========================================================================*)
-
- PROCEDURE dump_semaphores;
-
- VAR
-
- i : INTEGER;
- sem_num : BYTE;
- w_proc_l : sem_process_ptr;
- w_tcb : tcb_ptr;
-
- BEGIN;
-
- open_dump;
-
- FOR sem_num := 1 TO high_semaphore DO
- BEGIN;
-
- WRITELN(dump_file, 'Semaphore # ', sem_num);
-
- WITH sem_info_array[sem_num] DO
- BEGIN;
-
- CASE sem_status OF
- sem_clear : WRITELN(dump_file, 'Semaphore is clear');
- sem_shared : WRITELN(dump_file, 'Semaphore is shared');
- sem_exclusive : WRITELN(dump_file, 'Semaphore is exclusive');
- END;
-
- WRITELN(dump_file, 'Timeout is ',
- time_out, ' -- Xcount = ', excl_count);
- WRITELN(dump_file, 'Last unlock was ', p2x(last_unlock));
-
- w_proc_l := process_list;
- WHILE w_proc_l <> NIL DO
- BEGIN;
- WITH w_proc_l^.process_tcb^ DO
- BEGIN;
- IF task_is_dead(w_proc_l^.process_tcb) THEN
- WRITELN(dump_file,
- ' TCB # ', tcb_number,
- ' Dead status -- ', port_chan_s)
- ELSE
- WRITELN(dump_file,
- ' TCB # ', tcb_number, ' - ', tcb_name,
- ' - ', port_chan_s);
- WRITELN(dump_file,
- ' Locked by ', p2x(w_proc_l^.process_who));
-
- END;
- w_proc_l := w_proc_l^.next_process;
- END;
-
- END;
-
- END;
-
- close_dump;
-
- END;
-
- (*===========================================================================*)
- (* Dump a window *)
- (*===========================================================================*)
-
- PROCEDURE dump_window(win_num : BYTE);
-
- VAR
- i : WORD;
- p : POINTER;
- l : window_data_ptr;
- w : window_data_ptr;
-
- BEGIN;
-
- open_dump;
-
- WRITELN(dump_file);
- WRITELN(dump_file, 'Window #', win_num);
-
- WITH window_array[win_num] DO
- BEGIN;
-
- WRITELN(dump_file, 'Window active? = ', window_act);
- WRITELN(dump_file, 'Window cursor = ', window_cursor);
- WRITELN(dump_file, 'Window location = ', window_loc);
- WRITELN(dump_file, 'Window scrolling = ', window_scrollable);
- WRITELN(dump_file, 'Window at top? = ', window_at_top);
- WRITELN(dump_file, 'Window max data = ', window_max_data);
- WRITELN(dump_file, 'Window count = ', window_count);
- WRITELN(dump_file, 'Window data = ', p2x(window_data));
- WRITELN(dump_file, 'Window line = ', p2x(window_line));
- WRITELN(dump_file, 'Window last = ', p2x(window_last));
-
- WRITELN(dump_file);
-
- i := 500;
-
- w := window_line;
- l := window_line^.last_line;
- WHILE (w <> NIL) AND (w <> l) AND (i > 0) DO
- BEGIN;
-
- WRITELN(dump_file, p2x(w), '=', p2x(w^.next_line), '/',
- p2x(w^.last_line), ' ',
- w^.line_color);
-
- WRITELN(dump_file, LENGTH(w^.this_line), '-', w^.this_line);
-
- (* Only use this for overlay write into window area *)
- (* p := w;
- p := PTR(SEG(p^) - 17, OFS(p^));
- hex_dump_addr(p, 320); *)
-
- w := l;
- l := w^.last_line;
-
- DEC(i);
-
- END;
-
- WRITELN(dump_file, 'Window ends -- ', p2x(w), ' -- ', p2x(l),
- ' -- ', i);
-
- END;
-
- close_dump;
-
- END;
-
- (*===========================================================================*)
- (* Dump all windows *)
- (*===========================================================================*)
-
- PROCEDURE dump_window_all;
-
- VAR
- i : BYTE;
-
- BEGIN;
-
- FOR i := 0 TO window_max DO
- dump_window(i);
-
- END;
-
- (*===========================================================================*)
- (* Dump an action item *)
- (*===========================================================================*)
-
- PROCEDURE dump_action_item(p : action_msg_ptr);
- BEGIN;
-
- WRITELN(dump_file, 'Dumping action item at -- ', p2x(p));
- WRITELN(dump_file);
-
- WRITELN(dump_file, 'Next action = ', p2x(p^.next_action));
- WRITELN(dump_file, 'Action type = ', b2x(p^.action_type));
- dump_search_chain(p^.action_srch);
- WRITELN(dump_file, 'Action data = ');
- hex_dump_addr(@p^.action_info, 64);
-
- END;
-
- (*===========================================================================*)
- (* Dump all action items *)
- (*===========================================================================*)
-
- PROCEDURE dump_action_all;
-
- VAR
- p : action_msg_ptr;
- loop_count : BYTE;
-
- BEGIN;
-
- open_dump;
- loop_count := 10;
-
- p := first_msg_action;
-
- WRITELN(dump_file, 'Dumping action chain starting at -- ', p2x(p));
- WRITELN(dump_file);
-
- WHILE (p <> NIL) AND (loop_count > 0) DO
- BEGIN;
-
- DEC(loop_count);
-
- dump_action_item(p);
- p := p^.next_action;
-
- END;
-
- close_dump;
-
- END;
-
- (*===========================================================================*)
- (* Dump a search block *)
- (*===========================================================================*)
-
- PROCEDURE dump_search_item(p : search_block_ptr);
- BEGIN;
-
- WRITELN(dump_file, 'Dumping search item at -- ', p2x(p));
- WRITELN(dump_file);
-
- WRITELN(dump_file, 'Next search = ', p2x(p^.search_next));
- WRITELN(dump_file, 'Direction = ', p^.search_direction);
- WRITELN(dump_file, 'Ascend = ', p^.search_ascend );
- WRITELN(dump_file, 'Above = ', p^.search_above );
- WRITELN(dump_file, 'No Kill = ', p^.search_nok );
- WRITELN(dump_file, 'Invert = ', p^.search_invert );
- WRITELN(dump_file, 'One only = ', p^.search_one_only );
- WRITELN(dump_file, 'Type = ', p^.search_type );
- WRITELN(dump_file, 'Last msg = ', p2x(p^.search_last));
- WRITELN(dump_file, 'Message flag = ', w2x(p^.search_mf) );
- WRITELN(dump_file, 'Msg number = ', p^.search_msg_no );
- WRITELN(dump_file, 'Data = ');
- hex_dump(@p^.search_dt, 32);
-
- END;
-
- (*===========================================================================*)
- (* Dump all search blocks in a chain *)
- (*===========================================================================*)
-
- PROCEDURE dump_search_chain(p : search_block_ptr);
-
- VAR
- loop_count : BYTE;
-
- BEGIN;
-
- open_dump;
- loop_count := 10;
-
- WRITELN(dump_file, 'Dumping search chain starting at -- ', p2x(p));
- WRITELN(dump_file);
-
- WHILE (p <> NIL) AND (loop_count > 0) DO
- BEGIN;
- DEC(loop_count);
- dump_search_item(p);
- p := p^.search_next;
- END;
-
- close_dump;
-
- END;
-
- END.